home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Mac Game Programming Gurus / TricksOfTheMacGameProgrammingGurus.iso / More Source / Libraries / SAT 2.3b4 / Demo ƒ / myPlatform demo ƒ / sPlayerSprite.p < prev   
Text File  |  1995-04-23  |  3KB  |  132 lines

  1. { Player sprite for the Platform test}
  2.  
  3. unit sPlayerSprite;
  4.  
  5. interface
  6.  
  7.     uses
  8. {$IFC UNDEFINED THINK_PASCAL}
  9.         Types, Quickdraw, Events, ToolUtils,
  10. {$ENDC}
  11.         SAT;
  12.  
  13.     var
  14.         rightFaces, leftFaces: array[0..3] of FacePtr;
  15.         fallFace: array[0..1] of FacePtr;
  16.         done: Boolean; {Boolean that tells if we should quit}
  17.  
  18.     procedure InitPlayerSprite;
  19.     procedure SetupPlayerSprite (me: SpritePtr);
  20.     procedure HandlePlayerSprite (me: SpritePtr);
  21.     procedure HitPlayerSprite (me, him: SpritePtr);
  22.  
  23. implementation
  24.  
  25.     procedure InitPlayerSprite;
  26.         var
  27.             i: integer;
  28.     begin
  29.         for i := 0 to 3 do
  30.             rightFaces[i] := SATGetFace(128 + i);
  31.         for i := 0 to 3 do
  32.             leftFaces[i] := SATGetFace(132 + i);
  33.         for i := 0 to 1 do
  34.             fallFace[i] := SATGetFace(136 + i);
  35.     end;
  36.  
  37.     procedure SetupPlayerSprite (me: SpritePtr);
  38.     begin
  39.         me^.mode := 0;
  40.         me^.speed.h := 1;
  41.         me^.kind := 1; {Friend kind}
  42.         SetRect(me^.hotRect, 8, 0, 24, 32);
  43.         me^.face := fallFace[0];
  44.         me^.task := @HandlePlayerSprite;
  45.         me^.hittask := @HitPlayerSprite;
  46.     end;
  47.  
  48.     procedure HandlePlayerSprite (me: SpritePtr);
  49.         var
  50.             theEvent: EventRecord;
  51.     begin
  52.         if me^.kind = 10 then
  53.             begin
  54.                 me^.speed.h := me^.speed.h div 2;
  55.             end;
  56.  
  57.         if GetOSEvent(keyDownMask + autoKeyMask, theEvent) then
  58.             begin
  59.                 if BitAnd(theEvent.modifiers, cmdKey) <> 0 then
  60.                     case char(BitAnd(theEvent.message, charCodeMask)) of
  61.                         'q', 'Q': 
  62.                             done := true; {Command-Q: quit!}
  63.                     end; {case}
  64.                 if me^.kind <> 1 then{Touching something - then we can control!}
  65.                     case char(bitand(theEvent.message, charCodeMask)) of
  66.                         ',': 
  67.                             me^.speed.h := -5;
  68.                         '.': 
  69.                             me^.speed.h := 5;
  70.                         ' ': 
  71.                             me^.speed.v := -5;
  72.                         otherwise
  73.                     end;
  74.             end;
  75.  
  76.         me^.position.h := me^.position.h + me^.speed.h;
  77.         me^.position.v := me^.position.v + me^.speed.v;
  78.         if me^.kind < 3 then {acceleration when in midair!}
  79.             me^.speed.v := me^.speed.v + 1;
  80.         if me^.speed.v > 30 then
  81.             me^.speed.v := 30;
  82.  
  83.         if me^.kind > 1 then
  84.             me^.kind := me^.kind - 1;
  85.  
  86. {Make sure we are always visible!}
  87.         if me^.position.v < 0 then
  88.             begin
  89.                 me^.position.v := 0;
  90.                 me^.speed.v := 0;
  91.             end;
  92.         if me^.position.h < 0 then
  93.             begin
  94.                 me^.position.h := 0;
  95.                 me^.speed.h := abs(me^.speed.h);
  96.             end;
  97.         if me^.position.v > gSAT.offSizeV - 32 then
  98.             begin
  99.                 me^.position.v := gSAT.offSizeV - 32;
  100.                 me^.speed.v := -abs(me^.speed.v) * 2 div 3;
  101.                 me^.kind := 7; {Allow movement for a short while!}
  102.             end;
  103.         if me^.position.h > gSAT.offSizeH - 32 then
  104.             begin
  105.                 me^.position.h := gSAT.offSizeH - 32;
  106.                 me^.speed.h := -abs(me^.speed.h);
  107.             end;
  108.  
  109.         me^.mode := abs(me^.mode + 1);
  110.  
  111.         if me^.kind > 1 then
  112.             begin
  113.                 if me^.speed.h > 0 then
  114.                     me^.face := RightFaces[band(me^.mode div 3, 3)];
  115.                 if me^.speed.h < 0 then
  116.                     me^.face := LeftFaces[band(me^.mode div 3, 3)];
  117.             end
  118.         else
  119.             me^.face := FallFace[band(me^.mode, 1)];
  120.  
  121.         me^.layer := -me^.position.v;
  122.     end;
  123.  
  124.     procedure HitPlayerSprite;
  125.     begin
  126. {Hit something! We can take whatever action we need here, but in this case, we let OtherSprite decide.}
  127. {(We could have omitted this function altogether and passed nil.)}
  128.         if him^.kind = 1 then
  129.         else if him^.kind = 2 then
  130.     end;
  131.  
  132. end.